package com.hou.netty.tcp01.client;

import io.netty.bootstrap.Bootstrap;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.DelimiterBasedFrameDecoder;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;

//客户端
public class Client {
    public static void main(String[] args) throws Exception {
        //实际业务处理线程组
        EventLoopGroup workGroup = new NioEventLoopGroup();
        //创建客户端配置类
        Bootstrap bootstrap = new Bootstrap();
        //链式配置
        bootstrap.group(workGroup)
                .channel(NioSocketChannel.class) //指定客户端类型通道
                .handler(new ChannelInitializer<SocketChannel>() { //配置初始化
                    @Override
                    protected void initChannel(SocketChannel socketChannel) throws Exception {
                        //初始化时候设置特殊分隔符
                        ByteBuf buf = Unpooled.copiedBuffer("$_".getBytes());//转成bytebuf
                        socketChannel.pipeline().
                                //设置分隔符解码器
                                ///第一个参数表示单个消息的最大长度  第二个参数就是特殊分隔符
                                // (当消息到了最大长度还没查到分隔符，那么就会报错TooLongFrameException异常)
                                        addLast(new DelimiterBasedFrameDecoder(1024, buf))
                                //设置字符串编码,设置后客户端发送的数据就会转成String
                                .addLast(new StringEncoder())
                                //还可以设置字符串形式的解码,设置后客户端接受到的数据就会自动转成String
                                .addLast(new StringDecoder())//必须放到数据处理之前
                                .addLast(new ClientHandler());//绑定客户端数据处理对象
                    }
                });
        //与服务端连接,调用sync()方法来执行同步阻塞，直到连接完成
        ChannelFuture sync = bootstrap.connect("127.0.0.1", 9527).sync();
        //向服务端发送数据   Unpooled: netty提供的工具类,可以将其他类型转为buf类型
        sync.channel().writeAndFlush("我是客户端$_"); //使用了String编码器,可直接发送String
        sync.channel().writeAndFlush("我现在需要发送数据$_");
        sync.channel().writeAndFlush("你准备好了吗$_");
        //开启同步阻塞监听,直到断开连接才关闭通道
        sync.channel().closeFuture().sync();
        workGroup.shutdownGracefully();
    }
}
